create database if not exists enquetemobile;

use enquetemobile;

set FOREIGN_KEY_CHECKS = 0;
drop table if exists Pessoa;
drop table if exists EstadoCivil;
drop table if exists TipoPessoa;
drop table if exists Sexo;
drop table if exists RG;
drop table if exists TituloEleitoral;
drop table if exists Endereco;
drop table if exists TipoEndereco;
drop table if exists Cidade;
drop table if exists UnidadeFederativa;
drop table if exists Telefone;
drop table if exists TipoTelefone;
drop table if exists Usuario;
drop table if exists Cliente;
drop table if exists TipoUsuario;
drop table if exists Sistema;
drop table if exists AssuntoMensagem;
drop table if exists ConfiguracaoCliente;
drop table if exists LogBD;
drop table if exists TipoOperacaoBD;
drop table if exists LogApp;
drop table if exists TipoObjeto;
drop table if exists TipoAcaoAplicacao;
drop table if exists TipoObjetoPermissao;
drop table if exists Recurso;
drop table if exists TipoRecurso;
drop table if exists TipoObjeto_Recurso;
drop table if exists ControleComunicacao;
drop table if exists GerenciadorSessao;
drop table if exists GrupoUsuario;
drop table if exists Usuario_GrupoUsuario;
drop table if exists EscopoPermissao;
drop table if exists Permissao;
drop table if exists ConfiguracaoGlobal;
drop table if exists TipoEnderecoServidor;
drop table if exists DadosCorreioEletronico;
drop table if exists CorreioClienteEntrevistador;
drop table if exists TipoDispositivoMovel;
drop table if exists DispositivoMovel;
drop table if exists FabricanteDispositivoMovel;
drop table if exists Marca;
drop table if exists Modelo;
drop table if exists FornecedorDispositivoMovel;
drop table if exists Fornecedor_Fabricante;
drop table if exists AutorizadaDispositivoMovel;
drop table if exists AutorizadaFabricante;
drop table if exists NotaFiscal;
drop table if exists DispositivoMovel_NotaFiscal;
drop table if exists TipoOrigemGarantia;
drop table if exists GarantiaDispositivoMovel;
drop table if exists DadosManutencao;
drop table if exists DadosRemocao;
drop table if exists DadosAuditoria;
drop table if exists DadosSaidaEnquete;
drop table if exists EstadoDM;
drop table if exists TipoUsoDispositivoMovel;
drop table if exists TipoAcaoRemota;
drop table if exists UsoRemotoDM;
drop table if exists ControleUsoDM;
drop table if exists SeguradoraDispositivoMovel;
drop table if exists ContratoSeguro;
drop table if exists SeguroDispositivoMovel;
drop table if exists OperadoraTelefonia;
drop table if exists SimCard;
drop table if exists AreaAtuacao;
drop table if exists Atividade;
drop table if exists Entrevistado;
drop table if exists CategoriaPesquisa;
drop table if exists Pesquisa;
drop table if exists TipoResposta;
drop table if exists Questao;
drop table if exists Alternativa;
drop table if exists Resposta;
drop table if exists AlternativaResposta;
drop table if exists MotivoTerminoPesquisa;
drop table if exists Enquete;
drop table if exists TipoSinistroCoberturaSeguro;
drop table if exists AutorizacaoUsuarioPesquisa;
drop table if exists PesquisaDispositivoMovel;
drop table if exists GPS_Data;
drop table if exists StatusMensagemCorreio;
set FOREIGN_KEY_CHECKS = 1;

create table Pessoa
(
	Id bigint not null primary key auto_increment,
    Nome varchar(200) not null,
    NomeAbreviado varchar(120),
    EmailPrincipal varchar(120),
    EmailSecundario varchar(120),
    RG bigint,
    CPF varchar(14),
    CNPJ varchar(32),
    RazaoSocial varchar(200),
    InscricaoEstadual varchar(50),
    InscricaoMunicipal varchar(50),
    TituloEleitoral bigint,
    Sexo bigint,
    EstadoCivil bigint,
    DataDeNascimento datetime,
    TipoPessoa bigint,
    Valido boolean,
    ChaveAtivacao varchar(40),
    DataAtivacao datetime,
    DataHoraRegistro datetime not null default now(),
    DataHoraUltimaAtualizacao datetime not null default now(),
    NumeroDeRegistro varchar(64),
    Comentarios varchar(3000)
);

alter table Pessoa COMMENT = 'Dados comuns às pessoas do sistema.';

create table EstadoCivil
(
	Id bigint not null primary key auto_increment,
    Nome varchar(80) not null,
    Descritivo varchar(3000)
);

alter table EstadoCivil COMMENT = 'Tipos de estados civis (como solteiro, casado, viúvo, divorciado, etc).';

alter table Pessoa add constraint FK_Pessoa_EstadoCivil foreign key (EstadoCivil) references EstadoCivil(Id);

insert into EstadoCivil(Nome)
values ('ESCI_OUTRO'),
	   ('ESCI_SOLTEIRO'),
       ('ESCI_CASADO'),
       ('ESCI_VIUVO'),
       ('ESCI_DIVORCIADO'),
       ('ESCI_UNIAOESTAVEL');
       
create table TipoPessoa
(
	Id bigint not null primary key,
    Nome varchar(200) not null,
    Descritivo varchar(3000)
);

alter table TipoPessoa COMMENT = 'Tipos de pessoa segundo sua função jurídica.';

alter table Pessoa add constraint FK_Pessoa_TipoPessoa foreign key (TipoPessoa) references TipoPessoa(Id);

insert into TipoPessoa(Id, Nome)
values (1, 'TIPE_PESSOA_JURIDICA'),
	   (2, 'TIPE_PESSOA_FISICA');
       
create table Sexo
(
	Id bigint not null primary key,
    Nome varchar(200) not null,
    Descritivo varchar(3000)
);

alter table Sexo COMMENT = 'Tipos pré-definidos de sexo (masculino ou feminino).';

alter table Pessoa add constraint FK_Pessoa_Sexo foreign key (Sexo) references Sexo(Id);

insert into Sexo(Id, Nome)
values (1, 'SEXO_FEMININO'),
	   (2, 'SEXO_MASCULINO');
       
create table RG
(
	Id bigint not null primary key auto_increment,
    Numero varchar(20) not null,
    OrgaoExpeditor varchar(120) not null,
    EstadoExpeditor bigint not null,
    DataExpedicao datetime
);

alter table RG COMMENT = 'Registro de documentos identificadores de pessoas físicas.';

alter table Pessoa add constraint FK_Pessoa_RG foreign key (RG) references RG(Id);

create table TituloEleitoral
(
	Id bigint not null primary key auto_increment,
    NumeroTE varchar(40) not null,
    ZonaTE varchar(8) not null,
    SecaoTE varchar(8) not null,
    DataExpedicao datetime,
    EstadoExpedicao bigint not null
);

alter table tituloeleitoral COMMENT = 'Registro de título eleitoral de pessoa física..';

alter table Pessoa add constraint FK_Pessoa_TituloEleitoral foreign key (TituloEleitoral) references TituloEleitoral(Id);

create table Endereco
(
	Id bigint not null primary key auto_increment,
    TipoDeEndereco bigint,
    Logradouro varchar(300) not null,
    NumeroEndereco varchar(10),
    Complemento varchar(120),
    Bairro varchar(200),
    Cidade bigint not null,
    CEP varchar(15),
    Pessoa bigint,
    Comentarios varchar(3000),
    EnderecoPrincipal boolean not null default false,
    DataHoraRegistro datetime not null default now()
);

alter table Endereco COMMENT = 'Registro de endereço físico completo de pessoa..';

alter table Endereco add constraint FK_Endereco_Pessoa foreign key (Pessoa) references Pessoa(Id);

create table TipoEndereco
(
	Id bigint not null primary key auto_increment,
    Nome varchar(200) not null,
    CaminhoCompletoIcone varchar(300),
    Comentarios varchar(3000)
);

alter table tipoendereco COMMENT = 'Tipo de endereço segundo a sua função (residencial, comercial, etc).';

alter table Endereco add constraint FK_TipoEndereco_Endereco foreign key (TipoDeEndereco) references TipoEndereco(Id);

create table Cidade
(
	Id bigint not null primary key auto_increment,
    Nome varchar(300) not null,
    UnidadeFederativa bigint not null,
    Comentarios varchar(3000)
);

alter table Cidade COMMENT = 'Registro de municípios.';

alter table Endereco add constraint FK_Cidade_Endereco foreign key (Cidade) references Cidade(Id);

create table UnidadeFederativa
(
	Id bigint not null primary key auto_increment,
    Nome varchar(200) not null,
    Sigla varchar(3) not null,
    Comentarios varchar(3000)
);

alter table unidadefederativa COMMENT = 'Registro de unidades federativas (ou estados).';

alter table Cidade add constraint FK_UnidadeFederativa_Cidade foreign key (UnidadeFederativa) references UnidadeFederativa(Id);
alter table RG add constraint FK_RG_UnidadeFederativa foreign key (EstadoExpeditor) references UnidadeFederativa(Id);
alter table TituloEleitoral add constraint FK_TituloEleitoral_UnidadeFederativa foreign key (EstadoExpedicao) references UnidadeFederativa(Id);

create table Telefone
(
	Id bigint not null primary key auto_increment,
    DDD varchar(4) not null,
    NumeroTelefone varchar(12) not null,
    Ramal varchar(6),
    Pessoa bigint,
    TipoDeTelefone bigint,
    DataHoraRegistro datetime not null default now(),
    Comentarios varchar(3000)
);

alter table Telefone COMMENT = 'Registro de telefones de pessoas.';

alter table Telefone add constraint FK_Telefone_Pessoa foreign key (Pessoa) references Pessoa(Id);

create table TipoTelefone
(
	Id bigint not null primary key auto_increment,
    Nome varchar(200) not null,
    Comentarios varchar(3000),
    CaminhoCompletoIcone varchar(300)
);

alter table tipotelefone COMMENT = 'Tipo de telefone segundo o seu uso (residencial, comercial, etc).';

alter table Telefone add constraint FK_Telefone_TipoTelefone foreign key (TipoDeTelefone) references TipoTelefone(Id);

create table Cliente
(
	Id bigint not null primary key,
    Contato varchar(120),
    Gerente bigint not null,
    RazaoSocial varchar(200) not null
);

alter table cliente COMMENT = 'Registro de clientes do EnqueteMobile, isto é, empresas que registram as enquetes e as executam..';

alter table Cliente add constraint FK_Pessoa_Cliente foreign key (Id) references Pessoa(Id);

create table Usuario
(
	Id bigint not null primary key,
    ApelidoUsuario varchar(50) not null,
    Senha varchar(20),
    TipoUsuario bigint not null,
    Cliente bigint,
    PerguntaSecreta varchar(200),
    RespostaSecreta varchar(100),
    AlterarSenha boolean not null default false,
    UsuarioMestre boolean not null default false,
    Foto varchar(300),
    ControleRedefinicaoSenha varchar(50),
    DataHoraSolicitacaoRedefinicaoSenha datetime
);

alter table usuario COMMENT = 'Registro de usuários do sistema.';

alter table Usuario add constraint FK_Pessoa_Usuario foreign key (Id) references Pessoa(Id);
alter table Usuario add constraint FK_Usuario_Cliente foreign key (Cliente) references Cliente(Id);
alter table Cliente add constraint FK_Cliente_Gerente foreign key (Gerente) references Usuario(Id);

create table TipoUsuario
(
	Id bigint not null primary key,
    Nome varchar(200) not null,
    Descritivo varchar(3000)
);

alter table TipoUsuario COMMENT = 'Registro do tipo de usuário. O tipo define a área do sistema que o usuário poderá acessar (se a administrativa ou somente a do cliente.';

alter table Usuario add constraint FK_Usuario_TipoUsuario foreign key (TipoUsuario) references TipoUsuario(Id);

insert into TipoUsuario (Id, Nome)
values (1, 'TIUS_Sistema'),
	   (2, 'TIUS_Cliente');
       
create table Sistema
(
	Id bigint not null primary key auto_increment,
    Nome varchar(200) not null,
    Descricao varchar(3000),
    Movel boolean not null default false,
    ChaveSistema varchar(100),
    CaminhoCompletoIcone varchar(300)
);

alter table sistema COMMENT = 'Sistemas ou aplicações que poderão acessar o EnqueteMobile.';

create table AssuntoMensagem
(
	Id bigint not null primary key auto_increment,
    Nome varchar(200) not null,
    Descricao varchar(3000),
    DataHoraRegistro datetime not null default now()
);

alter table assuntomensagem COMMENT = 'Registro de assuntos de mensagem que usuário poderá enviar aos administradores do sistema pela página de envio de mensagem (aplicação web) ou tela de envio de mensagens (aplicação mobile).';

create table ConfiguracaoCliente
(
	Id bigint not null primary key auto_increment,
    Sistema bigint not null,
    Cliente bigint not null,
    DataHoraRegistro datetime not null default now(),
    DataHoraInvalidacao datetime,
    PeriodoTrocaPeriodicaSenha time,
    ToleranciaParaResponderEnquete time,
    ToleranciaSemMovimentacao time
);

alter table configuracaocliente COMMENT = 'Registro de configurações gerais específicas do cliente.';

alter table ConfiguracaoCliente add constraint FK_ConfiguracaoCliente_Sistema foreign key (Sistema) references Sistema(Id);
alter table ConfiguracaoCliente add constraint FK_ConfiguracaoCliente_Cliente foreign key (Cliente) references Cliente(Id);

create table LogBD
(
	Id bigint not null primary key auto_increment,
    DataHora datetime not null default now(),
    UsuarioBD varchar(120),
    UsuarioSistema varchar(120),
    Sistema bigint not null,
    NomeTabela varchar(120),
    IdRegistro bigint,
    ValoresAntigos varchar(8000),
    ValoresNovos varchar(8000),
    TipoDeOperacaoNoBancoDeDados bigint
);

alter table logbd COMMENT = 'Log de execução de operações no banco de dados.';

alter table LogBD add constraint FK_LogBD_Sistema foreign key (Sistema) references Sistema(Id);

create table TipoOperacaoBD
(
	Id bigint not null primary key,
    Nome varchar(120) not null,
    Descricao varchar(3000)
);

alter table tipooperacaobd COMMENT = 'Tipos de operação que a aplicação poderá executar no banco de dados (essencialmente operações CRUD).';

alter table LogBD add constraint FK_LogBD_TipoOperacaoBD foreign key (TipoDeOperacaoNoBancoDeDados) references TipoOperacaoBD(Id);

insert into TipoOperacaoBD(Id, Nome)
values (1, 'TOBD_CONSULTAR'),
	   (2, 'TOBD_CRIAR'),
       (3, 'TOBD_ATUALIZAR'),
       (4, 'TOBD_DELETAR');
       
create table LogApp
(
	Id bigint not null primary key auto_increment,
    Descricao varchar(3000),
    Sistema bigint not null,
    IP varchar(15) not null,
    DataHoraRegistroLogApp datetime,
    LoginDoUsuario varchar(120) not null,
    Modulo varchar(120) not null,
    Classe varchar(120),
    Metodo varchar(120),
    Parametros text,
    UrlArquivoFonte varchar(300) not null,
    NumeroLinhaCodigoFonte varchar(8),
    TipoDeAcaoDaAplicacao bigint,
    SQL_Code text,
    TipoExcecao varchar(120),
    ExcecaoCapturada text,
    Source text
);

alter table logapp COMMENT = 'Log de ações realizadas na aplicação (mais alto nível que o log de ações realizadas no banco).';

alter table LogApp add constraint FK_LogApp_Sistema foreign key (Sistema) references Sistema(Id);

create table TipoObjeto
(
	Id bigint not null primary key auto_increment,
    Nome varchar(200) not null,
    Descricao varchar(3000),
    IdentificadorLiteral int
);

alter table tipoobjeto COMMENT = 'Tipos de objeto ou entidades do sistema sobre os quais podem incidir permissões.';

create table TipoAcaoAplicacao
(
	Id bigint not null primary key auto_increment,
    Nome varchar(200) not null,
    Descricao varchar(3000),
    TipoObjeto bigint not null,
    DataHoraRegistro datetime not null default now()
);

alter table tipoacaoaplicacao COMMENT = 'Tipos de ações ou tarefas que podem ser executadas no sistema em relação a dado tipo de objeto (por exemplo, para o tipo de objeto Cliente, pode ser executada a criação deste, atualização do registro, bloqueio, etc).';

alter table TipoAcaoAplicacao add constraint FK_TipoAcaoAplicacao_TipoObjeto foreign key (TipoObjeto) references TipoObjeto(Id);
alter table LogApp add constraint FK_LogApp_TipoAcaoAplicacao foreign key (TipoDeAcaoDaAplicacao) references TipoAcaoAplicacao(Id);

create table TipoObjetoPermissao
(
	Id bigint not null primary key auto_increment,
    Nome varchar(200) not null,
    Descricao varchar(3000),
    TipoObjeto bigint not null,
    TipoAcaoAplicacao bigint not null,
    IdentificadorLiteral int
);

alter table TipoObjetoPermissao COMMENT = 'Permissões relacionadas às ações que podem ser executadas sobre cada tipo de objeto.';

alter table TipoObjetoPermissao add constraint FK_TipoObjetoPermissao_TipoObjeto foreign key (TipoObjeto) references TipoObjeto(Id);
alter table TipoObjetoPermissao add constraint FK_TipoObjetoPermissao_TipoAcaoAplicacao foreign key (TipoAcaoAplicacao) references TipoAcaoAplicacao(Id);

create table Recurso
(
	Id bigint not null primary key auto_increment,
    Nome varchar(200) not null,
    Comentarios varchar(3000),
    Sistema bigint not null,
    TipoRecurso bigint not null,
    Localizacao varchar(1000),
    ItemAdministrativo boolean not null default false
);

alter table Recurso COMMENT = 'Recursos físicos, como páginas web, frame de aplicação móvel, etc.';

alter table Recurso add constraint FK_Resurso_Sistema foreign key (Sistema) references Sistema(Id);

create table TipoRecurso
(
	Id bigint not null primary key auto_increment,
    Nome varchar(200) not null,
    Descricao varchar(3000),
    DataHoraRegistro datetime not null default now()
);

alter table tiporecurso COMMENT = 'Tipo ou categoria do recurso..';

alter table Recurso add constraint FK_Recurso_TipoRecurso foreign key (TipoRecurso) references TipoRecurso(Id);

create table TipoObjeto_Recurso
(
	ItemRecurso bigint not null,
    TipoObjeto bigint not null,
    PermissoesUsadas varchar(20),
    primary key (ItemRecurso, TipoObjeto)
);

alter table tipoobjeto_recurso COMMENT = 'Associa ao recurso os tipos de objeto ou entidades do sistema que poderão ser manipuladas neste.';

alter table TipoObjeto_Recurso add constraint FK_TipoObjetoRecurso_TipoObjeto foreign key (TipoObjeto) references TipoObjeto(Id);
alter table TipoObjeto_Recurso add constraint FK_TipoObjetoRecurso_Recurso foreign key (ItemRecurso) references Recurso(Id);

create table ControleComunicacao
(
	Id bigint not null primary key auto_increment,
    IdRemoto bigint,
    IdOperacao int,
    DispositivoMovel bigint not null,
    DataHoraSaida datetime,
    DataHoraEntrada datetime,
    ConteudoPacoteSaida text,
    ConteudoPacoteEntrada text,
    PossuiRetorno boolean not null default false,
    ChaveUsuario varchar(50),
    SentidoComunicacao int not null,
    Processado boolean not null default false,
    MensagemErro varchar(500)
);

alter table controlecomunicacao COMMENT = 'Tabela de gerenciamento da comunicação entre os dispositivos móveis e o servidor..';

create table GerenciadorSessao
(
	Id bigint not null primary key auto_increment,
    OrigemSessao bigint not null,
    ChaveSessao varchar(50),
    ChaveSistema varchar(50),
    IdUsuarioAutenticado bigint,
    DataHoraInicio datetime not null,
    DataHoraUltimaMovimentacao datetime not null,
    DataHoraExpiracao datetime,
    MotivoTermino varchar(400)
);

alter table GerenciadorSessao add constraint FK_GerenciadorSessao_Sistema foreign key (OrigemSessao) references Sistema(Id);

create table GrupoUsuario
(
	Id bigint not null primary key auto_increment,
    Nome varchar(200) not null,
    Descricao varchar(3000),
    GrupoDoSistema boolean,
    DataHoraRegistro datetime,
    DataHoraUltimaAtualizacao datetime
);

create table Usuario_GrupoUsuario
(
	Usuario bigint not null,
    GrupoDeUsuario bigint not null,
    primary key (Usuario, GrupoDeUsuario)
);

alter table Usuario_GrupoUsuario add constraint FK_UsuarioGrupoUsuario_Usuario foreign key (Usuario) references Usuario(Id);
alter table Usuario_GrupoUsuario add constraint FK_UsuarioGrupoUsuario_GrupoUsuario foreign key (GrupoDeUsuario) references GrupoUsuario(Id);

create table EscopoPermissao
(
	Id bigint not null primary key,
    Nome varchar(200) not null,
    Descricao varchar(3000)
);

insert into EscopoPermissao(Id, Nome)
values (0, 'ESPE_NENHUM'),
	   (1, 'ESPE_PROPRIO'),
       (2, 'ESPE_CLIENTE'),
       (3, 'ESPE_SISTEMA'),
       (4, 'ESPE_PUBLICO');
       
create table Permissao
(
	Id bigint not null primary key auto_increment,
    GrupoDeUsuario bigint,
    Usuario bigint,
    TipoObjeto int,
    EscopoPermissao bigint not null,
    LimiteNumeroRegistro int not null default 0, /* A priori sem limitação */
    PermissaoDoObjeto int,
    Valido boolean
);

alter table Permissao add constraint FK_Permissao_GrupoUsuario foreign key (GrupoDeUsuario) references GrupoUsuario(Id);
alter table Permissao add constraint FK_Permissao_Usuario foreign key (Usuario) references Usuario(Id);
alter table Permissao add constraint FK_Permissao_EscopoPermissao foreign key (EscopoPermissao) references EscopoPermissao(Id);

create table ConfiguracaoGlobal
(
	Id bigint not null primary key auto_increment,
    Sistema bigint not null,
    ConfiguracaoEnvioCorreioEletronicoGlobal bigint,
    SenhaMestra varchar(64),
    ToleranciaParaResponderEnquete time,
    TempoLimiteSessao time,
    ToleranciaSemMovimentacao time,
    MaximoUsuariosConectadosGlobal int not null default 0, /* A priori, sem limitação */
    MaximoUsuariosConectadosPorCliente int not null default 0, /* A priori, sem limitação */
    DataHoraRegistro datetime,
    DataHoraInvalidacao datetime
);

alter table ConfiguracaoGlobal add constraint FK_ConfiguracaoGlobal_Sistema foreign key (Sistema) references Sistema(Id);

create table TipoEnderecoServidor
(
	Id bigint not null primary key auto_increment,
    Nome varchar(200) not null,
    Descricao varchar(3000),
    FormatoString varchar(40),
    DataHoraRegistro datetime not null,
    UsuarioResponsavelPeloRegistro bigint not null
);

alter table TipoEnderecoServidor add constraint FK_TipoEnderecoServidor_Usuario foreign key (UsuarioResponsavelPeloRegistro) references Usuario(Id);

create table DadosCorreioEletronico
(
	Id bigint not null primary key auto_increment,
    Nome varchar(200) not null,
    Descricao varchar(3000) not null,
    ApelidoUsuario varchar(50) not null,
    Senha varchar(50) not null,
    UsarSSL boolean not null default 0,
    TipoDeEnderecoDoServidorSmtp bigint not null,
    EnderecoServidorSmtp varchar(200) not null,
    Porta varchar(8)
);

alter table DadosCorreioEletronico add constraint FK_DadosCorreioEletronico_TipoEnderecoServidor foreign key (TipoDeEnderecoDoServidorSmtp) references TipoEnderecoServidor(Id);
alter table ConfiguracaoGlobal add constraint FK_ConfiguracaoGlobal_DadosCorreioEletronico foreign key (ConfiguracaoEnvioCorreioEletronicoGlobal) references DadosCorreioEletronico(Id);

create table CorreioClienteEntrevistador
(
	Id bigint not null primary key auto_increment,
    Cliente bigint not null,
    Entrevistador bigint not null,
    Mensagem varchar(300) not null,
    SentidoComunicacao int not null,
    ControleDeComunicacao bigint,
    StatusMensagemCorreio bigint,
    ConfirmacaoAbertura boolean
);

alter table CorreioClienteEntrevistador add constraint FK_CorreioClienteEntrevistador_Cliente foreign key (Cliente) references Cliente(Id);
alter table CorreioClienteEntrevistador add constraint FK_CorreioClienteEntrevistador_Entrevistador foreign key (Entrevistador) references Usuario(Id);
alter table CorreioClienteEntrevistador add constraint FK_CorreioClienteEntrevistador_ControleComunicacao foreign key (ControleDeComunicacao) references ControleComunicacao(Id);

create table TipoDispositivoMovel
(
	Id bigint not null primary key auto_increment,
    Nome varchar(200) not null,
    Descricao varchar(3000),
    Sistema bigint not null
);

alter table TipoDispositivoMovel add constraint FK_TipoDispositivoMovel_Sistema foreign key (Sistema) references Sistema(Id);

create table DispositivoMovel
(
	Id bigint not null primary key auto_increment,
    Cliente bigint not null,
    ModeloDeDispositivoMovel bigint not null,
    TipoDispositivoMovel bigint not null,
    NumeroNotaFiscal varchar(50),
    IMEI varchar(20),
    RedesSuportadas varchar(200),
    UsuarioResponsavelPeloRegistro bigint not null,
    DataHoraRegistro datetime
);

alter table DispositivoMovel add constraint FK_DispositivoMovel_Cliente foreign key (Cliente) references Cliente(Id);
alter table DispositivoMovel add constraint FK_DispositivoMovel_Usuario foreign key (UsuarioResponsavelPeloRegistro) references Usuario(Id);
alter table DispositivoMovel add constraint FK_DispositivoMovel_TipoDispositivoMovel foreign key (TipoDispositivoMovel) references TipoDispositivoMovel(Id);
alter table ControleComunicacao add constraint FK_ControleComunicacao_DispositivoMovel foreign key (DispositivoMovel) references DispositivoMovel(Id);

create table FabricanteDispositivoMovel
(
	Id bigint not null primary key,
    RazaoSocial varchar(200),
    PaginaWeb varchar(300)
);

alter table FabricanteDispositivoMovel add constraint FK_FabricanteDispositivoMovel_Pessoa foreign key (Id) references Pessoa(Id);

create table Marca
(
	Id bigint not null primary key auto_increment,
    Nome varchar(200) not null,
    FabricanteDeDispositivoMovel bigint not null,
    Comentarios varchar(3000)
);

alter table Marca add constraint FK_Marca_FabricanteDispositivoMovel foreign key (FabricanteDeDispositivoMovel) references FabricanteDispositivoMovel(Id);

create table Modelo
(
	Id bigint not null primary key auto_increment,
    Nome varchar(200) not null,
    MarcaDeDispositivoMovel bigint not null,
    EspecificacoesTecnicas varchar(5000),
    RedesSuportadas varchar(500),
    PaginaWeb varchar(300),
    Comentarios varchar(3000)
);

alter table Modelo add constraint FK_Modelo_Marca foreign key (MarcaDeDispositivoMovel) references Marca(Id);
alter table DispositivoMovel add constraint FK_DispositivoMovel_Modelo foreign key (ModeloDeDispositivoMovel) references Modelo(Id);

create table FornecedorDispositivoMovel
(
	Id bigint not null primary key,
    RazaoSocial varchar(200),
    PaginaWeb varchar(300),
    Cliente bigint not null
);

alter table FornecedorDispositivoMovel add constraint FK_FornecedorDispositivoMovel_Cliente foreign key (Cliente) references Cliente(Id);
alter table FornecedorDispositivoMovel add constraint FK_FornecedorDispositivoMovel_Pessoa foreign key (Id) references Pessoa(Id);

create table Fornecedor_Fabricante
(
	FornecedorDeDispositivoMovel bigint not null,
    FabricanteDeDispositivoMovel bigint not null,
    DataHoraAssociacao datetime not null,
    primary key (FornecedorDeDispositivoMovel, FabricanteDeDispositivoMovel)
);

alter table Fornecedor_Fabricante add constraint FK_FornecedorFabricante_FornecedorDispositivoMovel foreign key (FornecedorDeDispositivoMovel) references FornecedorDispositivoMovel(Id);
alter table Fornecedor_Fabricante add constraint FK_FornecedorFabricante_FabricanteDispositivoMovel foreign key (FabricanteDeDispositivoMovel) references FabricanteDispositivoMovel(Id);

create table AutorizadaDispositivoMovel
(
	Id bigint not null primary key,
    Cliente bigint not null
);

alter table AutorizadaDispositivoMovel add constraint FK_AutorizadaDispositivoMovel_Cliente foreign key (Cliente) references Cliente(Id);
alter table AutorizadaDispositivoMovel add constraint FK_AutorizadaDispositivoMovel_Pessoa foreign key (Id) references Pessoa(Id);

create table AutorizadaFabricante
(
	Id bigint not null primary key auto_increment,
    Autorizada bigint not null,
    FabricanteDeDispositivoMovel bigint not null,
    ModelosTrabalhados varchar(500)
);

alter table AutorizadaFabricante add constraint FK_AutorizadaFabricante_AutorizadaDispositivoMovel foreign key (Autorizada) references AutorizadaDispositivoMovel(Id);
alter table AutorizadaFabricante add constraint FK_AutorizadaFabricante_FabricanteDispositivoMovel foreign key (FabricanteDeDispositivoMovel) references FabricanteDispositivoMovel(Id);

create table NotaFiscal
(
	Id bigint not null primary key auto_increment,
    Cliente bigint not null,
    FornecedorDeDispositivoMovel bigint not null,
    Numero varchar(40) not null,
    ProtocoloAutorizacaoUso varchar(40),
    DataHora datetime not null
);

alter table NotaFiscal add constraint FK_NotaFiscal_Cliente foreign key (Cliente) references Cliente(Id);
alter table NotaFiscal add constraint FK_NotaFiscal_FornecedorDispositivoMovel foreign key (FornecedorDeDispositivoMovel) references FornecedorDispositivoMovel(Id);

create table DispositivoMovel_NotaFiscal
(
	Id bigint not null primary key auto_increment,
    NotaFiscal bigint not null,
    DispositivoMovel bigint not null,
    Garantia bigint,
    MedidaUnidade varchar(30),
    ValorUnitario float,
    CodigoProduto varchar(40),
    Quantidade float not null,
    AliquotaIpi float,
    ValorIpi float,
    AliquotaIcms float,
    BaseCalculoIcms float,
    ValorIcms float,
    CFOP varchar(4),
    NCM varchar(8),
    CST varchar(3)
);

alter table DispositivoMovel_NotaFiscal add constraint FK_DispositivoMovelNotaFiscal_NotaFiscal foreign key (NotaFiscal) references NotaFiscal(Id);
alter table DispositivoMovel_NotaFiscal add constraint FK_DispositivoMovelNotaFiscal_DispositivoMovel foreign key (DispositivoMovel) references DispositivoMovel(Id);

create table TipoOrigemGarantia
(
	Id bigint not null primary key auto_increment,
    Nome varchar(200) not null,
    Descricao varchar(3000)
);

insert into TipoOrigemGarantia (Nome)
values ('TIOG_OUTRO'),
	   ('TIOG_FABRICANTE'),
       ('TIOG_FABRICANTE_EXTENDIDA'),
       ('TIOG_LOJA'),
       ('TIOG_LOJA_EXTENDIDA'),
       ('TIOG_SEGURO');
       
create table GarantiaDispositivoMovel
(
	Id bigint not null primary key auto_increment,
    NumeroContratoGarantia varchar(50),
    TipoDeOrigemDeGarantia bigint not null,
    DispositivoMovel bigint not null,
    ContratoDeSeguro bigint,
    DataHoraInicio datetime not null,
    DataHoraTerminoPrevisto datetime,
    DataHoraTerminoReal datetime,
    MotivoTermino varchar(500),
    Valor float
);

alter table GarantiaDispositivoMovel add constraint FK_GarantiaDispositivoMovel_TipoOrigemGarantia foreign key (TipoDeOrigemDeGarantia) references TipoOrigemGarantia(Id);
alter table GarantiaDispositivoMovel add constraint FK_GarantiaDispositivoMovel_DispositivoMovel foreign key (DispositivoMovel) references DispositivoMovel(Id);
alter table DispositivoMovel_NotaFiscal add constraint FK_DispositivoMovelNotaFiscal_GarantiaDispositivoMovel foreign key (Garantia) references GarantiaDispositivoMovel(Id);

create table DadosManutencao
(
	Id bigint not null primary key auto_increment,
    Autorizada bigint not null,
    ResponsavelPelaRetirada bigint,
    TecnicoResponsavelPeloReparo bigint,
    ServicoRealizado varchar(1000),
    ResponsavelPelaDevolucao bigint,
    CondicoesDeRetornoDoDispositivoMovel varchar(500),
    GarantiaCobriu boolean,
    RequerDescarte boolean,
    DataHoraInicio datetime not null,
    DataHoraTermino datetime,
    DataHoraSaidaAutorizada datetime,
    DataHoraEntradaAutorizada datetime,
    valor float,
    MotivoManutencao varchar(1000)
);

alter table DadosManutencao add constraint FK_DadosManutencao_AutorizadaDispositivoMovel foreign key (Autorizada) references AutorizadaDispositivoMovel(Id);
alter table DadosManutencao add constraint FK_DadosManutencao_ResponsavelRetirada foreign key (ResponsavelPelaRetirada) references Pessoa(Id);
alter table DadosManutencao add constraint FK_DadosManutencao_ResponsavelReparo foreign key (TecnicoResponsavelPeloReparo) references Pessoa(Id);
alter table DadosManutencao add constraint FK_DadosManutencao_ResponsavelDevolucao foreign key (ResponsavelPelaDevolucao) references Pessoa(Id);

create table DadosRemocao
(
	Id bigint not null primary key auto_increment,
    DadosBoletimOcorrencia varchar(1500),
    MotivoRemocaoDispositivoMovel varchar(1000),
    Destino varchar(1000)
);

create table DadosAuditoria
(
	Id bigint not null primary key auto_increment,
    ResponsavelPelaAuditoria bigint not null,
    ResultadoAuditoria varchar(1500),
    RequerManutencao boolean not null default 0,
    RequerDescarte boolean not null default 0
);

alter table DadosAuditoria add constraint FK_DadosAuditoria_ResponsavelAuditoria foreign key (ResponsavelPelaAuditoria) references Pessoa(Id);

create table DadosSaidaEnquete
(
	Id bigint not null primary key auto_increment,
    RequerManutencao boolean not null default 0,
    RequerDescarte boolean not null default 0,
    Comentarios varchar(3000),
    SimCard bigint,
    CondicoesDeRetornoDoDispositivoMovel varchar(1500)
);

create table EstadoDM
(
	Id bigint not null primary key auto_increment,
    Nome varchar(200),
    Descricao varchar(3000)
);

insert into EstadoDM(Nome)
values ('ESDM_OUTRO'),
	   ('ESDM_ENQUETEEXTERNA'),
       ('ESDM_DESCARTE'),
       ('ESDM_AUDITORIA'),
       ('ESDM_AQUISICAO'),
       ('ESDM_MANUTENCAO');

create table TipoUsoDispositivoMovel
(
	Id bigint not null primary key auto_increment,
    Nome varchar(200) not null,
    Descricao varchar(3000),
    ToleranciaMaxima time,
    EstadoDoDispositivoMovelAssociado bigint
);

alter table TipoUsoDispositivoMovel add constraint FK_TipoUsoDispositivoMovel_EstadoDM foreign key (EstadoDoDispositivoMovelAssociado) references EstadoDM(Id);

create table TipoAcaoRemota
(
	Id bigint not null primary key auto_increment,
    Nome varchar(200) not null,
    Descricao varchar(3000)
);

insert into TipoAcaoRemota(Nome)
values ('TAR_CONSULTADADOS'),
	   ('TAR_AUTENTICACAO'),
       ('TAR_SUBMISSAORESPOSTA'),
       ('TAR_SINCRONISMODADOS'),
       ('TAR_SINALVIDA'),
       ('TAR_VALIDACAOAUTENTICACAO');
       
create table UsoRemotoDM
(
	Id bigint not null primary key auto_increment,
    DataHora datetime not null,
    ControleDeUsoDoDispositivoMovel bigint,
    TipoDeAcaoRemota bigint,
    IP varchar(15),
    IMEI varchar(20),
    Comentarios varchar(3000),
    DadosGps bigint,
    ControleDeComunicacao bigint
);

alter table UsoRemotoDM add constraint FK_UsoRemotoDM_TipoAcaoRemota foreign key (TipoDeAcaoRemota) references TipoAcaoRemota(Id);
alter table UsoRemotoDM add constraint FK_UsoRemotoDM_ControleComunicacao foreign key (ControleDeComunicacao) references ControleComunicacao(Id);

create table ControleUsoDM
(
	Id bigint not null primary key auto_increment,
    Comentarios varchar(3000),
    FuncionarioResponsavel bigint not null,
    UsuarioResponsavelPeloRegistro bigint not null,
    DispositivoMovel bigint not null,
    DataHoraSaida_DM datetime,
    DataHoraDevolucao_DM datetime,
    TipoDeUsoDoDispositivoMovel bigint,
    DadosDeSaidaParaAuditoria bigint,
    DadosDeSaidaParaEnquete bigint,
    DadosDeSaidaParaRemocao bigint,
    DadosDeSaidaParaManutencao bigint
);

alter table ControleUsoDM add constraint FK_ControleUsoDM_FuncionarioResponsavel foreign key (FuncionarioResponsavel) references Usuario(Id);
alter table ControleUsoDM add constraint FK_ControleUsoDM_UsuarioResponsavel foreign key (UsuarioResponsavelPeloRegistro) references Usuario(Id);
alter table ControleUsoDM add constraint FK_ControleUsoDM_DispositivoMovel foreign key (DispositivoMovel) references DispositivoMovel(Id);
alter table ControleUsoDM add constraint FK_ControleUsoDM_TipoUsoDispositivoMovel foreign key (TipoDeUsoDoDispositivoMovel) references TipoUsoDispositivoMovel(Id);
alter table ControleUsoDM add constraint FK_ControleUsoDM_DadosAuditoria foreign key (DadosDeSaidaParaAuditoria) references DadosAuditoria(Id);
alter table ControleUsoDM add constraint FK_ControleUsoDM_DadosSaidaEnquete foreign key (DadosDeSaidaParaEnquete) references DadosSaidaEnquete(Id);
alter table ControleUsoDM add constraint FK_ControleUsoDM_DadosRemocao foreign key (DadosDeSaidaParaRemocao) references DadosRemocao(Id);
alter table ControleUsoDM add constraint FK_ControleUsoDM_Dados foreign key (DadosDeSaidaParaManutencao) references DadosManutencao(Id);
alter table UsoRemotoDM add constraint FK_UsoRemotoDM_ControleUsoDM foreign key (ControleDeUsoDoDispositivoMovel) references ControleUsoDM(Id);

create table SeguradoraDispositivoMovel
(
	Id bigint not null primary key,
    NumeroDeRegistro varchar(50),
    Cliente bigint not null,
    PaginaWeb varchar(300)
);

alter table SeguradoraDispositivoMovel add constraint FK_SeguradoraDispositivoMovel_Pessoa foreign key (Id) references Pessoa(Id);
alter table SeguradoraDispositivoMovel add constraint FK_SeguradoraDispositivoMovel_Cliente foreign key (Cliente) references Cliente(Id);

create table ContratoSeguro
(
	Id bigint not null primary key auto_increment,
    Cliente bigint not null,
    Seguradora bigint not null,
    NumeroContrato varchar(50),
    SinistrosCobertos varchar(20),
    Valor float,
    DataHoraRegistro datetime,
    DataHoraContratacao datetime,
    DataHoraTerminoPRevisto datetime,
    DataHoraTerminoReal datetime,
    Comentarios varchar(3000)
);

alter table ContratoSeguro add constraint FK_ContratoSeguro_Cliente foreign key (Cliente) references Cliente(Id);
alter table ContratoSeguro add constraint FK_ContratoSeguro_SeguradoraDispositivoMovel foreign key (Seguradora) references SeguradoraDispositivoMovel(Id);

create table SeguroDispositivoMovel
(
	Id bigint not null primary key auto_increment,
    DispositivoMovel bigint not null,
    ContratoSeguro bigint not null,
    ValorPeloDispositivo float,
    DataHoraInicio datetime,
    DataHoraTermino datetime,
    MotivoTermino varchar(1000)
);

alter table SeguroDispositivoMovel add constraint FK_SeguroDispositivoMovel_DispositivoMovel foreign key (DispositivoMovel) references DispositivoMovel(Id);
alter table SeguroDispositivoMovel add constraint FK_SeguroDispositivoMovel_ContratoSeguro foreign key (ContratoSeguro) references ContratoSeguro(Id);

create table OperadoraTelefonia
(
	Id bigint not null primary key,
    CodigoDiscagem varchar(3)
);

alter table OperadoraTelefonia add constraint FK_OperadoraTelefonia_Pessoa foreign key (Id) references Pessoa(Id);

create table SimCard
(
	Id bigint not null primary key auto_increment,
    Cliente bigint not null,
    Operadora bigint not null,
    IMSI varchar(30),
    Telefone bigint not null,
    Comentarios varchar(3000),
    DataHoraRegistro datetime
);

alter table SimCard add constraint FK_SimCard_Cliente foreign key (Cliente) references Cliente(Id);
alter table SimCard add constraint FK_SimCard_OperadoraTelefonia foreign key (Operadora) references OperadoraTelefonia(Id);
alter table SimCard add constraint FK_SimCard_Telefone foreign key (Telefone) references Telefone(Id);
alter table DadosSaidaEnquete add constraint FK_DadosSaidaEnquete_SimCard foreign key (SimCard) references SimCard(Id);

create table AreaAtuacao
(
	Id bigint not null primary key auto_increment,
    Nome varchar(200) not null,
    Comentarios varchar(3000) not null,
    AreaAtuacaoPai bigint
);

alter table AreaAtuacao add constraint FK_AreaAtuacao_AreaAtuacaoPai foreign key (AreaAtuacaoPai) references AreaAtuacao(Id);

create table Atividade
(
	Id bigint not null primary key auto_increment,
    Nome varchar(200) not null,
    Comentarios varchar(3000),
    AreaAtuacao bigint not null
);

alter table Atividade add constraint FK_Atividade_AreaAtuacao foreign key (AreaAtuacao) references AreaAtuacao(Id);

create table Entrevistado
(
	Id bigint not null primary key,
    Atividade bigint,
    Usuario bigint
);

alter table Entrevistado add constraint FK_Entrevistado_Pessoa foreign key (Id) references Pessoa(Id);
alter table Entrevistado add constraint FK_Entrevistado_Atividade foreign key (Atividade) references Atividade(Id);
alter table Entrevistado add constraint FK_Entrevistado_Usuario foreign key (Usuario) references Usuario(Id);

create table CategoriaPesquisa
(
	Id bigint not null primary key auto_increment,
    Nome varchar(200) not null,
    Descricao varchar(3000),
    CategoriaMestra bigint,
    PodeAdicionarPesquisas boolean not null default false,
    Cliente bigint
);

alter table CategoriaPesquisa add constraint FK_CategoriaPesquisa_Cliente foreign key (Cliente) references Cliente(Id);
alter table CategoriaPesquisa add constraint FK_CategoriaPesquisa_CategoriaMestra foreign key (CategoriaMestra) references CategoriaPesquisa(Id);

create table Pesquisa
(
	Id bigint not null primary key auto_increment,
    Nome varchar(200) not null,
    Descricao varchar(3000),
    Cliente bigint not null,
    CategoriaDePesquisa bigint,
    CamposDeIdentificacaoObrigatorios varchar(400),
    RespostaSemAutenticacao boolean not null default false,
    DataHoraRegistro datetime,
    DataHoraInicio datetime,
    DataHoraTermino datetime,
    DataHoraUltimaAtualizacao datetime,
    UsuarioResponsavelPeloRegistro bigint not null,
    UsuarioResponsavelPelaUltimaAtualizacao bigint not null,
    Publico boolean not null default false,
    Valido boolean not null default true
);

alter table Pesquisa add constraint FK_Pesquisa_Cliente foreign key (Cliente) references Cliente(Id);
alter table Pesquisa add constraint FK_Pesquisa_CategoriaPesquisa foreign key (CategoriaDePesquisa) references CategoriaPesquisa(Id);
alter table Pesquisa add constraint FK_Pesquisa_UsuarioResponsavelPeloRegistro foreign key (UsuarioResponsavelPeloRegistro) references Usuario(Id);
alter table Pesquisa add constraint FK_Pesquisa_UsuarioResponsavelPelaUltimaAtualizacao foreign key (UsuarioResponsavelPelaUltimaAtualizacao) references Usuario(Id);

create table TipoResposta
(
	Id bigint not null primary key auto_increment,
    Nome varchar(200) not null,
    Comentarios varchar(3000),
    PermiteMultiplasRespostas boolean not null default false,
    ObjetoHtml varchar(25)
);

create table Questao
(
	Id bigint not null primary key auto_increment,
    Pesquisa bigint not null,
    Enunciado varchar(1500),
    TipoResposta bigint,
    NumeroQuestao int not null,
    QuestaoObrigatoria boolean not null default false,
    JustificativaObrigatoria boolean not null default false,
    MensagemJustificativaPersonalizada varchar(300),
    MaximoAlternativasSelecionaveis int,
    AlternativaPadrao bigint,
    IdOperacaoPendente int,
    DataHoraRegistro datetime,
    DataHoraUltimaAtualizacao datetime,
    Valido boolean not null default true
);

alter table Questao add constraint FK_Questao_Pesquisa foreign key (Pesquisa) references Pesquisa(Id);
alter table Questao add constraint FK_Questao_TipoResposta foreign key (TipoResposta) references TipoResposta(Id);

create table Alternativa
(
	Id bigint not null auto_increment primary key,
    Questao bigint not null,
    Numero int not null,
    ValorAlternativa varchar(200),
    ProximaQuestao bigint,
    JustificativaObrigatoria boolean,
    IdOperacaoPendente int,
    DataHoraRegistro datetime,
    DataHoraUltimaAtualizacao datetime,
    Valido boolean not null default true
);

alter table Alternativa add constraint FK_Alternativa_Questao foreign key (Questao) references Questao(Id);
alter table Alternativa add constraint FK_Alternativa_QuestaoProxima foreign key (ProximaQuestao) references Questao(Id);
alter table Questao add constraint FK_Questao_AlternativaPadrao foreign key (AlternativaPadrao) references Alternativa(Id);

create table Resposta
(
	Id bigint not null primary key auto_increment,
    Enquete bigint not null,
    Questao bigint not null,
    RespostaTextual varchar(1500),
    JustificativaResposta varchar(1500),
    DataHora datetime not null,
    DadosGps bigint
);

alter table Resposta add constraint FK_Resposta_Questao foreign key (Questao) references Questao(Id);

create table AlternativaResposta
(
	Id bigint not null primary key auto_increment,
    Resposta bigint not null,
    Alternativa bigint not null
);

alter table AlternativaResposta add constraint FK_AlternativaResposta_Alternativa foreign key (Alternativa) references Alternativa(Id);
alter table AlternativaResposta add constraint FK_AlternativaResposta_Resposta foreign key (Resposta) references Resposta(Id);

create table MotivoTerminoPesquisa
(
	Id bigint not null primary key auto_increment,
    Nome varchar(200) not null,
    Descricao varchar(3000)
);

insert into MotivoTerminoPesquisa(Nome)
values ('MOTP_OUTRO'),
	   ('MOTP_PESQUISA_CONCLUIDA'),
       ('MOTP_CANCELAMENTO'),
       ('MOTP_SESSAO_EXPIRADA');
       
create table Enquete
(
	Id bigint not null primary key auto_increment,
    OrigemEnquete bigint,
    Entrevistador bigint,
    Entrevistado bigint,
    IPEntrevistado varchar(15),
    Pesquisa bigint,
    DataHoraInicio datetime not null,
    DataHoraUltimaAtividade datetime not null,
    DataHoraTermino datetime,
    MotivoTermino bigint,
    MensagemErro varchar(300),
    DadosGps bigint
);

alter table Enquete add constraint FK_Enquete_Sistema foreign key (OrigemEnquete) references Sistema(Id);
alter table Enquete add constraint FK_Enquete_Entrevistador foreign key (Entrevistador) references Usuario(Id);
alter table Enquete add constraint FK_Enquete_Entrevistado foreign key (Entrevistado) references Entrevistado(Id);
alter table Enquete add constraint FK_Enquete_Pesquisa foreign key (Pesquisa) references Pesquisa(Id);
alter table Enquete add constraint FK_Enquete_MotivoTerminoPesquisa foreign key (MotivoTermino) references MotivoTerminoPesquisa(Id);

create table TipoSinistroCoberturaSeguro
(
	Id bigint not null primary key auto_increment,
    Nome varchar(200) not null,
    Descricao varchar(3000)
);

insert into TipoSinistroCoberturaSeguro (Nome)
values ('TSCS_NENHUM'),
	   ('TSCS_DADOS'),
       ('TSCS_PERDA'),
       ('TSCS_FURTO'),
       ('TSCS_ROUBO'),
       ('TSCS_ACIDENTE'),
       ('TSCS_DEFEITO');
       
create table AutorizacaoUsuarioPesquisa
(
	Usuario bigint not null,
    Pesquisa bigint not null,
    primary key (Usuario, Pesquisa)
);

alter table AutorizacaoUsuarioPesquisa add constraint FK_AutorizacaoUsuarioPesquisa_Usuario foreign key (Usuario) references Usuario(Id);
alter table AutorizacaoUsuarioPesquisa add constraint FK_AutorizacaoUsuarioPesquisa_Pesquisa foreign key (Pesquisa) references Pesquisa(Id);

create table PesquisaDispositivoMovel
(
	Pesquisa bigint not null,
    DispositivoMovel bigint not null,
    primary key (Pesquisa, DispositivoMovel)
);

alter table PesquisaDispositivoMovel add constraint FK_PesquisaDispositivoMovel_Pesquisa foreign key (Pesquisa) references Pesquisa(Id);
alter table PesquisaDispositivoMovel add constraint FK_PesquisaDispositivoMovel_DispositivoMovel foreign key (DispositivoMovel) references DispositivoMovel(Id);

create table GPS_Data
(
	Id bigint not null primary key auto_increment,
    IdRemoto bigint not null,
    Latitude float,
    Longitude float,
    DispositivoMovel bigint not null
);

alter table GPS_Data add constraint FK_GpsData_DispositivoMovel foreign key (DispositivoMovel) references DispositivoMovel(Id);
alter table Enquete add constraint FK_Enquete_GpsData foreign key (DadosGps) references GPS_Data(Id);
alter table Resposta add constraint FK_Resposta_GpsData foreign key (DadosGps) references GPS_Data(Id);
alter table UsoRemotoDM add constraint FK_UsoRemotoDM_GpsData foreign key (DadosGps) references GPS_Data(Id);

create table StatusMensagemCorreio
(
	Id bigint not null primary key auto_increment,
    Nome varchar(200) not null,
    Descricao varchar(2000)
);

insert into StatusMensagemCorreio(Nome)
values ('STMC_NENHUM'),
	   ('STMC_ENVIADO'),
       ('STMC_RECEBIDO'),
       ('STMC_AGUARDANDO_ENVIO'),
       ('STMC_AGUARDANDO_RESPOSTA'),
       ('STMC_AGUARDAND_RETORNO');